/***************************************************************************
 *   Copyright (C) 2007 by Warren Kenny   				   *
 *   warren.kenny@gmail.com   						   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include <gsUtility/gsDataPacker.h>

#include <gsUtility/gsMemory.h>

gsDataPacker::gsDataPacker()
{
}


gsBool gsDataPacker::appendToBuffer( 		char *dataBuffer, 
						const unsigned int bufferSize, 
						const unsigned int offset, 
						unsigned int &newOffset, 
						const void *const sourceBuffer, 
						const unsigned int sourceBufferSize )
{
	newOffset = offset + sourceBufferSize;
	if( (dataBuffer && sourceBuffer) && ( offset <= bufferSize ) && ( newOffset <= bufferSize ) )
	{
		dataBuffer += offset;
		gsMemory::memoryCopy( dataBuffer, sourceBuffer, sourceBufferSize );
		return true;
	}
	else
	{
		return false;
	}
	
}
	
gsBool gsDataPacker::removeFromBuffer(		const char *dataBuffer, 
						const unsigned int bufferSize, 
						const unsigned int offset, 
						unsigned int &newOffset, 
						void *const destinationBuffer, 
						const unsigned int destinationBufferSize )
{
	newOffset = offset + destinationBufferSize;
	if( ( dataBuffer && destinationBuffer ) && ( offset <= bufferSize ) && ( newOffset <= bufferSize ) )
	{
		dataBuffer += offset;
		gsMemory::memoryCopy( destinationBuffer, dataBuffer, destinationBufferSize );
		return true;
	}
	else
	{
		return false;
	}
}

gsBool gsDataPacker::bufferCopy( 		char *destination, 
					unsigned int destinationSize, 
     					const unsigned int offset, 
	  				unsigned int &newOffset, 
       					const void *source, 
	    				const unsigned int sourceSize )
{
	newOffset = offset + sourceSize;
	if( ( destination && source ) && ( offset <= destinationSize ) && ( newOffset <= destinationSize ) )
	{
		destination += offset;
		gsMemory::memoryCopy( destination, source, sourceSize );
		return true;
	}
	else
	{
		return false;
	}
}


gsDataPacker::~gsDataPacker()
{
}


